/**
 * 游戏控制
 */
(function (cjs,an){
    console.log('ASCaiNiao');
    //const cjs=createjs;
    /**
     * 游戏控制器（总控制）
     */
    const GameControl={
        /**
         * 游戏控制器初始化
         * @param {Container} root 根容器
         * @param {Array} modules 在初始化阶段启动的游戏功能模块
         */
        init:function(root,modules){
            //游戏层级显示控制器初始化
            LayerControl.init(root);
            //游戏功能模块启动
            modules.forEach(element => {
                element.init();
            });
        }
    };
    /**
     * 游戏层级显示控制器
     * 把游戏内容分层显示，分为背景层、主活动层、UI层、顶层。
     * 背景层：用于显示背景内容
     * 主活动层：用于显示游戏主体内容
     * UI层：用于显示界面或者菜单
     * 顶层：用于弹窗显示或者toast
     */
    const LayerControl={
        /** 背景层 */
        background_layer:new cjs.Container,
        /** 主活动层 */
        main_layer:new cjs.Container,
        /** UI层 */
        ui_layer:new cjs.Container,
        /** 顶层 */
        top_layer:new cjs.Container,
        /**
         * 游戏层级显示控制器初始化
         * @param {Container} root 根容器
         */
        init:function(root){
            this.background_layer.parent=root;
            root.addChild(this.background_layer);

            this.main_layer.parent=root;
            root.addChild(this.main_layer);

            this.ui_layer.parent = root;
            root.addChild(this.ui_layer);

            this.top_layer.parent = root;
            root.addChild(this.top_layer);
        }
    };
    /**
     * 游戏通讯控制器
     */
    const MessageControl={
        //消息分发器,私有属性，不建议使用
        _dispatcher: new cjs.EventDispatcher(),
        /**
         * 发送消息
         * @param {String|createjs.Event} evt 消息名称或者Event对象
         * @returns 
         */
        send:function(evt){
            if (typeof evt == 'string') {
                this._dispatcher.dispatchEvent(new cjs.Event(evt));
                return;
            }
            this._dispatcher.dispatchEvent(evt);
        },
        /**
         * 接收消息
         * @param {String} name 消息名称
         * @param {Function} callback 回调函数
         */
        on:function(name,callback,once=false){
            this._dispatcher.addEventListener(name, callback);
            if(once){
                this.off(name, callback);
            }
        },
        /**
         * 移除消息监听
         * @param {String} name 消息名称
         * @param {Function} callback 回调函数 
         */
        off:function(name,callback){
            this.dispatcher.removeEventListener(name, callback);
        }
    };

    //const ASCaiNiao={GameControl,LayerControl,MessageControl};
    //an.ASCaiNiao=ASCaiNiao;
    an.GameControl=GameControl;
    an.LayerControl=LayerControl;
    an.MessageControl=MessageControl;
})(createjs = createjs||{}, AdobeAn = AdobeAn||{});
var createjs, AdobeAn;